#include "tela.h"
#include "ui_tela.h"

#include <QFile>
#include <QTreeWidget>
#include <QDir>

#include "fileitem.h"

QString Tela::pasta_inicial = "/";

Tela::Tela(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::Tela)
{
    ui->setupUi(this);
    this->server = new QTcpServer();
    this->server->listen(QHostAddress::Any, 50000);
    connect (this->server, SIGNAL(newConnection()), this, SLOT(novaConexao()));
    connect (this->ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(ativarBotao()));
    connect (this->ui->lineEdit_2, SIGNAL(textChanged(QString)), this, SLOT(ativarBotao()));
    this->ui->pushButton->setEnabled(false);
    connect(this->ui->pushButton, SIGNAL(clicked()), this, SLOT(iniciarMiddleware()));
}

void Tela::novaConexao ()
{
    EnvioArquivo* envio_arquivo = new EnvioArquivo(this->server->nextPendingConnection());
    this->arquivos_envio.append(envio_arquivo);
}

Tela::~Tela()
{
    delete ui;
}

void Tela::arquivoClicado(QTreeWidgetItem* item)
{
    FileItem* file = (FileItem*) item;
    qDebug () << file->getNome() << "***" << file->getLocalizacao();
    if (file->getLocalizacao().contains(this->conexao->getEnderecoLocal())) {
        qDebug () << "arquivo existe localmente!!!";
    }
    else {
        TransmissaoArquivo* arquivo = new TransmissaoArquivo(file);
        connect(arquivo, SIGNAL(transmissaoFinalizada(QString)), this, SLOT(transmissaoFinalizada(QString)));
        this->arquivos_recepcao.append(arquivo);
    }
}

void Tela::transmissaoFinalizada(QString nome_arquivo)
{
    qDebug () << nome_arquivo;
    this->inf.setText("Arquivo transferido com sucesso!");
    this->inf.show();
    for (int i = 0; i < this->arquivos_recepcao.size(); i++) {
        if (this->arquivos_recepcao.at(i) == this->sender()) {
            this->arquivos_recepcao.removeAt(i);
            i = this->arquivos_recepcao.size() + 1;
        }
    }
    QFile file(Tela::pasta_inicial + nome_arquivo);
    FileItem* item = new FileItem();
    item->setNomeArquivo(nome_arquivo);
    item->setTamanho(file.size());
    item->adicionarLocalizacao(this->conexao->getEnderecoLocal());
    this->conexao->adicionarArquivoInterno(item);
}

void Tela::iniciarMiddleware()
{
    Tela::pasta_inicial = this->ui->lineEdit->text();
    if (!Tela::pasta_inicial.endsWith(QString(QDir::separator())))
        Tela::pasta_inicial += QString(QDir::separator());
    conexao = new Conexao(this->ui->lineEdit_2->text());
    connect (this->conexao->getVisualizador(), SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
             this, SLOT(arquivoClicado(QTreeWidgetItem*)));
    connect (this->conexao, SIGNAL(erroRede(QAbstractSocket::SocketError)),
             this, SLOT(erroServicoAtualizacao(QAbstractSocket::SocketError)));
    connect (this->conexao, SIGNAL(conexaoIniciada()), this, SLOT(servicoAtualizacaoIniciado()));
}

void Tela::servicoAtualizacaoIniciado()
{
    this->ui->pushButton->setEnabled(false);
    inf.setText("Conexao estabelecida!");
    inf.show();
    this->conexao->getVisualizador()->show();
    disconnect (this->ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(ativarBotao()));
    disconnect (this->ui->lineEdit_2, SIGNAL(textChanged(QString)), this, SLOT(ativarBotao()));
}

void Tela::erroServicoAtualizacao(QAbstractSocket::SocketError error)
{
    if (error == QAbstractSocket::SocketAccessError || error == QAbstractSocket::HostNotFoundError) {
        inf.setText("Erro no servico de atalizacao!\nVerfique o endereco do servidor e reconecte.");
        inf.show();
    }
}

void Tela::ativarBotao()
{
    QString texto = this->ui->lineEdit->text();
    QDir dir(texto);
    if (!dir.exists() || texto == "") {
        this->ui->pushButton->setEnabled(false);
        return;
    }

    texto = this->ui->lineEdit_2->text();
    QStringList lista = texto.split(".");

    if (lista.size() != 4) {
        this->ui->pushButton->setEnabled(false);
        return;
    }

    for (int i = 0; i < 4; i++) {
        bool ok;
        if (lista.at(i) == "") {
            this->ui->pushButton->setEnabled(false);
            return;
        }
        int num;
        num = lista.at(i).toInt(&ok);
        if (ok == false || num < 0 || num > 255 || lista.at(i).size() > 3) {
            this->ui->pushButton->setEnabled(false);
            return;
        }
    }

    this->ui->pushButton->setEnabled(true);
    return;
}
